/*
 * @Author: 张宇飞
 * @Date: 2020-03-02 16:05:25
 * @LastEditors: 张宇飞
 * @LastEditTime: 2020-03-03 00:01:23
 * @Description: 演示 once 函数的使用。
 * @Email: zhangyufei49@163.com
 */

#include <stdio.h>
#include <unistd.h>

#include "utils.h"

static pthread_once_t once = PTHREAD_ONCE_INIT;
static void init() {
    // 注意，这里会阻塞调用线程。因为这个函数会和调用线程运行在统一个线程内
    // 这一点可以通过观察线程 id 来查看
    sleep(2);
    show_thread_msg("init some thing");
}

static void* a(void* arg) {
    // 这里的调用你会发现不运行。这就是 once 函数的特性
    pthread_once(&once, init);
    show_thread_msg("start");
    return NULL;
}

int main(int argc, char const* argv[]) {
    show_thread_msg("main");
    pthread_once(&once, init);
    run_threads(a, a, NULL);
    return 0;
}
